/**
 * 目标区间的模式为 [2^i * j, 2^i * (j + 1))
 * 给定区间[L, R]，将其分割为若干个目标模式区间的划分，且数量最少
 * 注意到划分出的区间数量要尽可能少，则i应该尽可能大，不证明只感觉
 * 但是必须满足 L = 2 ^ i * j， 用二进制表示其实就是 L = j << i
 * 因此第一个i的取值与L的最低位1有关。
 * 最简单的例子，如果L是奇数，则i只能是零
 * 因此，第一个区间的长度是 lowbit(L)， 第一个区间是 [L, L+lowbit(L))
 * 然后更新L，继续即可。
 * 对于R，则计算减法即可。
 * 
 * 还有一种递归分治的做法
 * f(a, b, L, R):
 *     if L <= a and b <= R: return [(a, b)]
 *     mid = (a + b) // 2
 *     if R <= m: return f(a, m, L, R)
 *     if m <= L: return f(m, b, L, R)
 *     return f(a, m, L, R) + f(m, b, L, R)
 * 
 * 最开始调用 f(0, 2^60, L, R) 即可
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using pii = pair<llt, llt>;
using vpii = vector<pii>;
using vll = vector<llt>;

template<typename T>
void input(vector<T> & a, int n){
    a.assign(n + 1, {});
    for(int i=1;i<=n;++i) cin >> a[i];
    return;
}

template<typename T>
istream & operator >> (istream & is, vector<T> & v){
    for(auto & i : v) is >> i;
    return is;
}

llt lowbit(llt x){return x & -x;}

llt L, R;

void work(){
    cin >> L >> R;
    vpii uec, vec;
    while(1){
        if(L){
            auto t = lowbit(L);
            if(L + t <= R){
                uec.push_back({L, L + t});
                if(L + t == R) break;
                L += t;
            }            
        }
        auto t = lowbit(R);
        if(R - t >= L){
            vec.push_back({R - t, R});
            if(R - t == L) break;
            R -= t;
        }
    }
    cout << uec.size() + vec.size() << "\n";
    for(const auto & p : uec) cout << p.first << " " << p.second << "\n";
    for(auto it=vec.rbegin(),et=vec.rend();it!=et;++it) cout << it->first << " " << it->second << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}